#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <ctype.h>
#include <unistd.h>
#include <sys/wait.h>

int main(int argc, char *argv[]){
	pid_t child_pid = 0;
	int i,n;

	if(argc != 2){
		fprintf(stderr, "Usage: %s processes\n", argv[0]);
		return 1;
	}

	// 创建子进程
	n = atoi(argv[1]);
	for(i=1; i<n; ++i){
		if((child_pid = fork()) <= 0)
				break;
	}

	// 此时子进程会break出来执行下面的代码
	// 子进程调用wait函数会返回-1，并将errno设置为ECHILD，因此不会被该for循环所阻塞。
	// 它们的消息可能会以任何的顺序出现，在等待了所有子进程后，来自原始进程的消息会出现在最后。
	for( ; ;){
		child_pid = wait(NULL);
		if((child_pid == -1) && (errno != EINTR)){
			break;
		}
	}

	fprintf(stderr, "I am process %ld, my parent is %ld\n", (long)getpid(), (long)getppid());
	return 0;
}
